home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
tcclib.exe
/
lha
/
GETFILE.C
< prev
next >
Wrap
Text File
|
1990-02-07
|
5KB
|
205 lines
#include <conio.h>
#include <stdio.h>
#include <Gcomm.h>
#include <alloc.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char Name[9];
char Ext[4];
char Attribute;
unsigned int Date;
unsigned int Time;
unsigned long Size;
int Tag;
} FileStruc;
typedef struct {
char Name[13];
} FileNameStruc;
#define MAXFILES 500
FileStruc *ScanDir( char *Mask, int Type );
char *FileName( FileStruc *f );
int GComm( void );
void HideCursor( void );
void BlockErase( int x, int y, int xx, int yy );
void DrawBox( int x, int y, int xx, int yy );
void DrawBox1( int x, int y, int xx, int yy );
void HLin( int x, int y, int xx, int yy );
void ChangeBlock( int x, int y, int xx, int yy, unsigned char attrib );
void AtSay( int x, int y, register char *s );
void AtSayF( int x, int y, char *fmt, ... );
void NPrintFA( int len, unsigned char attrib, char *fmt, ... );
int GetLine( char *s, int len, int start );
void TcclibInitialize( void );
extern int ScdirDone;
extern unsigned char A_NORMAL;
extern unsigned char A_REVERSE;
int CompareFileNames( FileNameStruc *A, FileNameStruc *B )
{
return( strcmp( A->Name, B->Name ) );
}
char *GetFile( int x, int y, int xx, int yy,
char *Mask, int FileAttrib, int ExtOn )
{
register FileNameStruc *File;
register int i;
int j, cols, rows, Width, files, top, oldptr, oldtop;
static char RetName[15];
FileStruc *fp;
int ptr;
char *Scr1, *Scr2;
int ch;
TcclibInitialize();
cols = xx - x + 1;
rows = yy - y + 1;
if ( cols < 14 || rows < 4 ) return( NULL );
if ( ( Scr1 = (char *) calloc( rows*2, cols ) ) == NULL )
return( NULL );
if ( ( Scr2 = (char *) calloc( 6, 14 ) ) == NULL )
return( NULL );
if ( ( File = (FileNameStruc *) calloc( MAXFILES, 13 ) ) == NULL )
return( NULL );
gettext( x, y, xx, yy, Scr1 );
BlockErase( x, y, xx, yy );
DrawBox( x, y, xx, yy );
gotoxy( x+1, y );
NPrintFA( cols-4, A_REVERSE, " %s ", Mask );
x++;
y++;
xx--;
yy--;
files = 0;
ScdirDone = 1;
while ( ( fp = ScanDir( Mask, FileAttrib ) ) != NULL && files < MAXFILES-1 ) {
if ( ExtOn )
strcpy( File[files++].Name, FileName( fp ) );
else
strcpy( File[files++].Name, fp->Name );
}
if ( ExtOn )
Width = 14;
else
Width = 10;
rows -= 2;
cols = (xx - x + 3) / Width;
qsort( File, files, sizeof( FileNameStruc ), CompareFileNames );
top = 0;
RedrawFiles:
BlockErase( x, y, xx, yy );
if ( top > 0 )
AtSay( xx-9, yy+1, "PgUp/" );
else
HLin( xx-9, yy+1, xx-5, yy+1 );
if ( cols * rows + top < files ) {
AtSay( xx-4, yy+1, "PgDn" );
}
else
HLin( xx-5, yy+1, xx-1, yy+1 );
for ( i=0; i<cols; ++i )
for ( j=0; j<rows; ++j )
if ( files > ( i * rows + j + top ) )
AtSayF( x + Width * i, y + j,
"%s", File[i * rows + j + top].Name );
ptr = 0;
for (;;) {
ChangeBlock( x, y, xx, yy, A_NORMAL );
ChangeBlock( x + ( ptr / rows * Width ),
y + ( ptr % rows ),
x + ( ptr / rows * Width ) + Width - 3,
y + ( ptr % rows ),
A_REVERSE );
oldptr = ptr;
oldtop = top;
HideCursor();
switch( ch = GComm() ) {
case CR:
strcpy( RetName, File[ptr + top].Name );
puttext( x-1, y-1, xx+1, yy+1, Scr1 );
free( Scr1 );
free( Scr2 );
free( File );
return( RetName );
case ESC:
puttext( x-1, y-1, xx+1, yy+1, Scr1 );
free( Scr1 );
free( Scr2 );
free( File );
return( NULL );
case DOWN:
if ( ptr < rows * cols - 1 )
ptr++;
break;
case UP:
if ( ptr )
ptr--;
break;
case RIGHT:
if ( ptr < rows * cols - rows )
ptr += rows;
break;
case LEFT:
if ( ptr >= rows )
ptr -= rows;
break;
case PGDN:
if ( top + rows * cols < files ) {
top += rows * cols;
goto RedrawFiles;
}
break;
case PGUP:
if ( top ) {
top -= rows * cols;
if ( top < 0 ) top = 0;
goto RedrawFiles;
}
break;
default:
if ( ch > ' ' && ch < 128 ) {
gettext( x-1, y, x+12, y+2, Scr2 );
BlockErase( x-1, y, x+12, y+2 );
DrawBox1( x-1, y, x+12, y+2 );
AtSay( x+2, y, "New File" );
gotoxy( x, y+1 );
putch( ch );
memset( RetName, 0, sizeof (RetName) );
RetName[0] = ch;
if ( -1 == GetLine( RetName, 12, 1 ) ) {
puttext( x-1, y, x+12, y+2, Scr2 );
break;
}
puttext( x-1, y-1, xx+1, yy+1, Scr1 );
free( Scr1 );
free( Scr2 );
free( File );
return( RetName );
}
break;
}
if ( top < 0 ) top = 0;
if ( !strlen( File[top+ptr].Name ) ) {
ptr = oldptr;
top = oldtop;
}
}
}